package com.xxwu.messagequeue.mqserver.core;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Data;
import lombok.Setter;

import java.util.HashMap;
import java.util.Map;

@Data
public class Exchange {

    //使用枚举类型标识交换机的种类
    private ExchangeType type = ExchangeType.Direct;

    //使用name作为交换机的身份标识
    private String name;
    //是否持久化
    private boolean durable = false;
    //是否自动删除
    private boolean autoDelete = false;
    // 交换机中其他可选的参数信息
    @Setter
    private HashMap<String, Object> argument = new HashMap<>();

    // 当属性赋值时，Mybatis 会从数据库中读数据，再写入到对象中，为对象赋值
    // 但数据库中显然不能存储 Map 类型的值，所以这里将进行 Map 和 Json 字符串之间的转化
    // 以下这两个方法时给数据库操作时使用
    public void setArgument(String argumentJson) {
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            // 这里的作用是，将Json字符串，转化为对应的HashMap，创建了一个匿名内部类将 HashMap作为泛型参数传入
            this.argument = objectMapper.readValue(argumentJson, new TypeReference<HashMap<String, Object>>() {});
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
    }

    // 当向数据库中写入数据时，则要先从 get 方法中读取数据，再写入到数据库中
    // 这里要将数据库中 Json格式的字符串转化为 HashMap 存储到对象中
    public String getArgument() {
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            return objectMapper.writeValueAsString(argument);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        // 如果这里传入的Json格式不符合要求就会抛出异常，返回空串即可
        return "{}";
    }

    // 下面这两个方法是程序员用于测试插入交换机
    // 后面 Mybatis 在插入数据库时，还是会调用上面的两个方法进行插入
    public void setArgument(String argKey, String argValue) {
        argument.put(argKey, argValue);
    }
    public Object getArgument(String argKey) {
        return argument.get(argKey);
    }

    public void setArgument(HashMap<String, Object> argument) {
        this.argument = argument;
    }
}
